package com.xb.Shuffle_the_Array_654;

import java.util.Arrays;

/**
 *  1470. 重新排列数组
 * 给你一个数组 nums ，数组中有 2n 个元素，按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。
 *
 * 请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列，返回重排后的数组
 *
 * 输入：nums = [2,5,1,3,4,7], n = 3
 * 输出：[2,3,5,4,1,7]
 * 解释：由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ，所以答案为 [2,3,5,4,1,7]
 *
 */
class Solution {
    //暴力解法 分奇偶数
    public int[] shuffle(int[] nums, int n) {
        int[] ints = new int[nums.length];
        for (int i = 0, j = 0; i < ints.length; i++) {
            if (i % 2 ==0){
                ints[i] = nums[j++];
            }else {
                ints[i] = nums[n++];
            }
        }
        return ints;
    }
    public int[] shuffle2(int[] nums, int n) {
        for (int i = 0; i < n; i ++ ) {
            //0x3ff -> 1023 1024这个去除全是0的 这个是交给负数去存储的
            // 最大的数为1000
            //那么最大的位数就是
            //2^10 = 1024-1>1000来存储
            //10 0000 0000 那么这个时候int就剩下22位来进行存储
            System.out.println("nums[i]--->" +nums[i]);
            //第一次int为2
            //      10 0000 0010
            //&     11 1111 1111
            //      10 0000 0010
            nums[i * 2] |= (nums[i] & 0x3ff) << 10;
            nums[i * 2 + 1] |= (nums[i + n] & 0x3ff) << 10;

        }
        return Arrays.stream(nums).map(item -> item >> 10).toArray();
    }
    //这个方法的好处就是直接通过一次就加两个 因为x1 x2是连在一起不同的
    public int[] shuffle3(int[] nums, int n) {
        int[] ints = new int[n<<1];
        int index = 0;
        for (int i = 0; i < n; i++) {
           ints[index++] = nums[i];
           ints[index++] = nums[n+i];
        }
        return ints;
    }

    public static void main(String[] args) {
        int[] ints = {2, 5, 1, 3, 4, 7};
        Solution solution = new Solution();
        int[] shuffle = solution.shuffle2(ints, 3);
        for (int i : shuffle) {
            System.out.printf("%d ,",i);
        }

    }
}
